/*

Como funciona ESTE tetris:

0 1 2 3 4 5 6 7 

0 0 0 0 0 0 0 0    0 /8
0 0 0 0 0 0 0 0    1 /16
0 0 0 0 0 0 0 0    2 /24
0 0 0 0 0 0 0 0    3 /32
0 0 0 0 0 0 0 0    4 /40
0 0 0 0 0 0 0 0    5 /48
0 0 0 0 0 0 0 0    6 /56
0 0 0 0 0 0 1 1 1   7 /64
0 0 0 0 0 0 1 0    8 /72
0 0 0 0 0 0 0 0    9 /80
0 0 0 0 0 0 0 0   10 /88 
0 0 0 0 0 0 0 0   11 /96
0 0 0 0 0 0 0 0   12 /104
0 0 0 0 0 0 0 0   13 /112
0 0 0 0 0 0 0 0   14 /120
0 0 0 0 0 0 0 0   15 /128


asignar en el inicio:
columna = 0
fila = 0

saber la posicion en el tablero unidimensional:
postablero = (anchotablero x fila) + columna

*Ejemplo: queremos colocar una pieza en la columna 4 fila 5, la posicion en el tablero unidimensional sera:
postablero = (8 x 5) + 4 = 44
postablero = (8 x 1) + 0 = 8  - en este caso es fila 1 columna 0, vemos que es 8 porque numeramos desde 0 

si al dibujar igualamos el ancho de la pieza, debemos aumentar una fila:
fila = fila + 1

si nuestra pieza sobrepasa el borde derecho, debemos reducir la columna:
Ej: 

0 1 2 3 4 5 6 7 

0 0 0 0 0 0 0 0    0 /8
0 0 0 0 0 0 0 0    1 /16
0 0 0 0 0 0 0 0    2 /24
0 0 0 0 0 0 0 0    3 /32
0 0 0 0 0 0 2 2 2  4 /40
0 0 0 0 0 0 2 0    5 /48
0 0 0 0 0 0 0 0    6 /56
0 0 0 0 0 0 1 1   7 /64
0 0 0 0 0 0 1 0    8 /72
0 0 0 0 0 0 1 0    9 /80
0 0 0 0 0 0 0 0   10 /88 
0 0 0 0 0 0 0 0   11 /96
0 0 0 0 0 0 0 0   12 /104
0 0 0 0 0 0 0 0   13 /112
0 0 0 0 0 0 0 0   14 /120
0 0 0 0 0 0 0 0   15 /128 

nuestra pieza se sobrepaso una columna

si (columna + ancho de la pieza > ancho del tablero) entonces debemos reducir nuestra columna hasta que:
			**(columna + ancho de la pieza = ancho del tablero)**


columna = 7 fila = 8

for(i =0;i<tamarray;i++)
{
	if(pieza.array[i] =! 0)cont++;
	if(i == piezaancho)cont = 0;
	if(cont > ancho)
	{
		columna -= 1;
	}
	
}


*/








#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include "../../sprite.h"
#include "../../render.h"





/*Definimos un nombre asociado a un numero para cada pieza*/

#define PIEZA_S 0
#define PIEZA_N 1
#define PIEZA_L 2
#define PIEZA_J 3
#define PIEZA_T 4
#define PIEZA_I 5
#define PIEZA_O 6 

int pieza_actual;

/*alto y ancho del tablero*/

const int alto = 16;
const int ancho = 8;
const int total_tablero = 128;

int tablero[16*8];

/*estructura de las piezas*/
typedef struct pieza
{
	int ancho;
	int rotaciones;
	int tamarray;
	int columna,fila;
	int **array;
};


/*crear piezas*/

pieza piezas[7];


/*creamos imagenes de los tiles*/

SE_sprite *tile_transparente;
SE_sprite *tile_azul;
SE_sprite *tile_rojo;
SE_sprite *tile_amarillo;
SE_sprite *tile_verde;


/*funcion que crea un array de 2 dimensiones*/

void create2darray(int **array,int x,int y)
{
	int i;
	array = (int**)malloc(x*sizeof(int*);
	for(i = 0;i<x;i++)
	{
		array[i] = (int*)malloc(y*sizeof(int));		
	};

}


/*inicia las piezas*/

void initpiezas()
{
	/*pieza s*/
	piezas[0].ancho = 3;
	piezas[0].tamarray = 9;
	piezas[0].rotaciones = 2;
	create2darray(piezas[0].array,piezas[0].rotaciones,piezas[0].tamarray);
	piezas[0].array = {
		{0,1,1
		 1,1,0,
		 0,0,0},
		{0,1,0,
		 0,1,1,
		 0,0,1}
	};

	/*pieza n*/
	piezas[1].ancho = 3;
	piezas[1].rotaciones = 2;
	create2darray(piezas[1].array,piezas[1].rotaciones,piezas[1].ancho);
	piezas[1].array = {
		{1,1,0,
		 0,1,1,
		 0,0,0},
		{0,0,1,
		 0,1,1,
		 0,1,0}
	};

	/*pieza l*/
	piezas[2].ancho = 3;
	piezas[2].rotaciones = 4;
	create2darray(piezas[2].array,piezas[2].rotaciones,piezas[2].ancho);
	piezas[2].array = {
		{1,0,0,
		 1,0,0,
		 1,1,0},
		{0,0,1,
		 1,1,1,
		 0,0,0},
		{1,1,0,
		 0,1,0,
		 0,1,0},
		{1,1,1,
		 1,0,0,
		 0,0,0}
	};

	/*pieza j*/

	piezas[3].ancho = 3;
	piezas[3].rotaciones = 4;
	create2darray(piezas[3].array,piezas[3].rotaciones,piezas[3].ancho);
	piezas[3].array = {
		{0,1,0,
		 0,1,0,
		 1,1,0},
		{1,1,1,
		 0,0,1,
		 0,0,0},
		{1,1,0,
		 1,0,0,
		 1,0,0},
		{1,0,0,
		 1,1,1,
		 0,0,0}
	};

	/*pieza t*/

	piezas[4].ancho = 3;
	piezas[4].rotaciones = 4;
	create2darray(piezas[4].array,piezas[4].rotaciones,piezas[4].ancho);
	piezas[4].array = {
		{1,0,0,
		 1,1,0,
		 1,0,0},
		{0,1,0,
		 1,1,1,
		 0,0,0},
		{0,1,0,
		 1,1,0,
		 0,1,0},
		{1,1,1,
		 0,1,0,
		 0,0,0}
	};

	/*pieza I*/

	piezas[5].ancho = 4;
	piezas[5].rotaciones = 2;
	create2darray(piezas[5].array,piezas[5].rotaciones,piezas[5].ancho);
	piezas[5].array = {
		{1,0,0,0,
		 1,0,0,0,
		 1,0,0,0,
		 1,0,0,0},
		{1,1,1,1,
		 0,0,0,0,
		 0,0,0,0,
		 0,0,0,0}
	};

	/*pieza o*/

	piezas[6].ancho = 2;
	piezas[6].rotaciones = 1;
	create2darray(piezas[6].array,piezas[6].rotaciones,piezas[6].ancho);
	piezas[6].array = {
		{1,1,
		 1,1}
	};
}


/*iniciar tablero*/

void inittablero()
{
	int i;
	int n = ancho*alto;
	for(i = 0,i<n;i++)tablero[i] = 0;


}


/*asigna pieza al tablero: 
0 s
1 n
2 l
3 j
4 t
5 I
6 o
*/


int detectar_colision(int columna,int fila)
{
	
int postablero = (ancho * fila) + columna;	

	if((tablero[postablero] =! 0)||fila > ancho||columna > ancho) 
	{
		return 1;
	}	

}

int movimiento_posible(int n,int columna,int fila,int rotacion)
{

int i;
int c = columna;
int f = fila;
int pieza_ancho = piezas[n].ancho;
int pieza_total = piezas[n].tamarray;
	for(i =0;i<pieza_total;i++)
	{
		c++;
		if(i == pieza_ancho)
		{
			c = columna;
			f++;
		}			
		if(piezas[n].array[rotacion][i] =! 0)
		{		
			if(detectar_colision(c,f) == 1)return 1;
		}					
	
	}

}

void asignarpieza(int n,int columna,int fila,int rotacion)
{
int i;
int cont = 0;
int postablero = 0;
int 
	for(i=0;i<tamarray;i++)
	{
		
	}

}



/*cargar sprites*/

void cargarsprites()
{





}





int main(int argc,char* args[])
{


int quit = 0;
int x = 0;
float rotx = 0.0;
float roty = 0.0;
float rotz = 0.0;
Uint8 *keys;
initgraphics();
cargarsprites();
GLfloat rot = 0;
float l = 1.0;





	while(quit == 0)
	{

			clearscreen(1.0f,1.0f,0.0f,0.0f);			
			//setspriterotation(ani,0,0,5);	
			//drawsprite(ani);
			rot += 1.0;
			l -= 0.01;
			setinvert(ima,0);
			setalpha(ima2,0.5);
			//settint(ima,0.0,0.0,0.0);
			//setlight(ima,l);
			//setrotation(ima,rot,rot,0);

			renderimage(ima);
			renderimage(ima2);

			//rendersection(ima,0,0,128,128,256,256);

			flipscene();
			
			keys=SDL_GetKeyState(NULL);

			// consultamos el estado del joystick
			if (keys[SDLK_UP] && (ani->y > 0)) ani->y = ani->y - 5;
			if (keys[SDLK_DOWN] && ((ani->y + 256) < 480)) ani->y = ani->y + 5;
			if (keys[SDLK_LEFT]) ima->x = ima->x - 5;
			if (keys[SDLK_RIGHT]) ima->x = ima->x + 5;
			if (keys[SDLK_u]) rotz += 1.0;
			if (keys[SDLK_i]) rotz -= 1.0;
			if (keys[SDLK_j]) roty += 1.0;
			if (keys[SDLK_k]) roty -= 1.0;
			if (keys[SDLK_n]) rotx += 1.0;
			if (keys[SDLK_m]) rotx -= 1.0;
			while( SDL_PollEvent( &event ) )
	        	{
				
         			
							
					
			
				if( event.type == SDL_QUIT )
				{
					quit = 1;
				}
			

			}


			

			
				

			
		
	}

return 0;







}
